Aurora Serverless V2 の最小 ACU 0 を AWS CDK でも簡単に設定可能になりました

Aurora Serverless V2 の最小 ACU 0 を AWS CDK でも簡単に設定可能になりました

Clock Icon2024.11.29

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最近のリリースである v2.171.0 で、下記の機能アップデートが追加されていました。

rds: support zero ACU for Aurora Serverless V2 (#32231) (d1b07d9)

ACU とは Aurora Capacity Unit の略で、Aurora Serverless V2 でのリソースの単位です。これまでの Aurora Serverless V2 では最小 ACU が 0.5 でしたが、下記で発表された Amazon Aurora のアップデートにより最小 ACU を 0 に設定可能となっていました。

https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-aurora-serverless-v2-scaling-zero-capacity/
https://aws.amazon.com/blogs/database/introducing-scaling-to-0-capacity-with-amazon-aurora-serverless-v2/

そして AWS CDK でも今回のアップデートにより、L2 Construct で最小 ACU を 0 に設定可能となりました。

試してみた

従来の実装

まずは従来から可能だった最小 ACU が 0 より大きい (0.5) の実装を試してみます。

CDK 実装
lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const vpc = new ec2.Vpc(this, 'VPC', {
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'PrivateIsolated',
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
        },
      ],
      natGateways: 0,
    });

    new rds.DatabaseCluster(this, 'RdsInstance', {
      engine: rds.DatabaseClusterEngine.auroraMysql({
        version: rds.AuroraMysqlEngineVersion.VER_3_08_0,
      }),
      serverlessV2MaxCapacity: 1,
      serverlessV2MinCapacity: 0.5, // 最小 ACU
      writer: cdk.aws_rds.ClusterInstance.serverlessV2('Writer'),
      vpc,
      vpcSubnets: {
        subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
      },
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });
  }
}

実装をデプロイすると、下記のように最小 ACU が 0.5 となりました。

CDK パッケージのアップデート

AWS CDK モジュールを v2.171.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest

ゼロキャパシティの実装

MySQL の Aurora Serverless V2 クラスターで先ほど作成していた Writer インスタンスの最小 ACU を 0 に設定してみます。設定は serverlessV2MinCapacity に 0 を指定することにより行います。

lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const vpc = new ec2.Vpc(this, 'VPC', {
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'PrivateIsolated',
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
        },
      ],
      natGateways: 0,
    });

    new rds.DatabaseCluster(this, 'RdsInstance', {
      engine: rds.DatabaseClusterEngine.auroraMysql({
        version: rds.AuroraMysqlEngineVersion.VER_3_08_0,
      }),
      serverlessV2MaxCapacity: 1,
      serverlessV2MinCapacity: 0, // 最小 ACU
      writer: cdk.aws_rds.ClusterInstance.serverlessV2('Writer'),
      vpc,
      vpcSubnets: {
        subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
      },
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });
  }
}

CDK Diff を確認すると、ServerlessV2ScalingConfiguration.MinCapacity が 0 に変更されていることがわかります。

$ npx cdk diff Main
start: Building ee14cb2e0ef049e8a7361326e845458652290507d1f85a8590a5d86144e7ace1:current_account-current_region
success: Built ee14cb2e0ef049e8a7361326e845458652290507d1f85a8590a5d86144e7ace1:current_account-current_region
start: Publishing ee14cb2e0ef049e8a7361326e845458652290507d1f85a8590a5d86144e7ace1:current_account-current_region
success: Published ee14cb2e0ef049e8a7361326e845458652290507d1f85a8590a5d86144e7ace1:current_account-current_region
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack Main
Resources
[~] AWS::RDS::DBCluster RdsInstance RdsInstance1D827D17
 └─ [~] ServerlessV2ScalingConfiguration
     └─ [~] .MinCapacity:
         ├─ [-] 0.5
         └─ [+] 0


✨  Number of stacks with differences: 1

CDK デプロイを行うと10秒程度で完了しました。はやい。

マネジメントコンソールで確認すると、Writer インスタンスの最小 ACU が 0 となっていることが確認できました。

トラブルシュート

CDK のバージョンが v2.171.0 未満の場合

AWS CDK のバージョンが v2.171.0 未満の場合に、最小 ACU を 0 に設定すると Synth 実行時に下記のエラーが発生します。

Error: serverlessV2MinCapacity must be >= 0.5 & <= 256
    at DatabaseCluster.validateServerlessScalingConfig (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk-lib/aws-rds/lib/cluster.js:5:549)
    at new DatabaseClusterNew (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk-lib/aws-rds/lib/cluster.js:1:4854)
    at new DatabaseCluster (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk-lib/aws-rds/lib/cluster.js:5:4528)
    at new MainStack (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/lib/main-stack.ts:21:5)
    at Object.<anonymous> (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/bin/cdk_sample_app.ts:7:1)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Module.m._compile (/Users/wakatsuki.ryuta/.npm/_npx/1bf7c3c15bf47d04/node_modules/ts-node/src/index.ts:1618:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/wakatsuki.ryuta/.npm/_npx/1bf7c3c15bf47d04/node_modules/ts-node/src/index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
Subprocess exited with error 1

CDK パッケージのアップデートを忘れずに行うようにしましょう。

最小 ACU 0 がサポートされていない DB エンジンを指定した場合

エンジンバージョンに MySQL 3.07.1 を指定してデプロイを行うと、下記のエラーが発生しました。

$ npm run deploy Main

> cdk_sample_app@0.1.0 deploy
> cdk deploy --require-approval never --method=direct Main


✨  Synthesis time: 4.75s

Main: deploying... [1/1]
Main: updating stack...
12:03:54 AM | UPDATE_FAILED        | AWS::RDS::DBCluster                         | RdsInstance
Resource handler returned message: "Cannot upgrade aurora-mysql from 8.0.mysql_aurora.3.08.0 to 8.0.mysql_aurora.3.07.1 (
Service: Rds, Status Code: 400, Request ID: 7281178d-1c70-4ac9-a504-0c4185eccccb)" (RequestToken: 6b895336-fce2-a1f8-7c2e
-7c99f2f838a4, HandlerErrorCode: InvalidRequest)

最小 ACU 0 を設定する場合は以下のデータベースは次のエンジンバージョン以上である必要があります。

  • PostgreSQL : 16.3, 15.7, 14.12, 13.15
  • MySQL : 3.08.0 以上

おわりに

Aurora Serverless V2 の最小 ACU 0 を AWS CDK でも簡単に設定可能になったので試してみました。

最小 ACU 0 を設定することによりアクティビティのないインスタンスが自動的に停止するようになり課金全体に占める従量制部分の割合がより大きくなったため、いよいよ "Serverless" というサービス名に名前負けのしないサービスになったと感じました。コスト削減が重視される環境やプロダクトでぜひとも採用していきたいですね。

参考

https://dev.classmethod.jp/articles/aws-cdk-aurora-serverless-v2/
https://dev.classmethod.jp/articles/amazon-aurora-serverless-v2-supports-acu0-pause-resume/

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.